package com.example.utils;

/**
 * @Description TODO
 * @Author fantasy
 * @Date 2024/6/27 22:33
 **/


public class ThreadLocalUtil {
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    /**
     * 将给定的对象设置到线程局部变量中。
     *
     * 此方法的作用是将一个对象存储到线程局部变量（ThreadLocal）中，使得该对象只能被当前线程访问和获取。
     * 这种方式常用于需要在多个方法间共享但又不应该被其他线程干扰的数据上，例如，数据库连接或用户会话信息。
     *
     * @param obj 要设置为线程局部变量的对象。这个对象应该对当前线程来说是唯一的，或者至少在当前线程的上下文中是有意义的。
     */
    public static void set(Object obj) {
        THREAD_LOCAL.set(obj);
    }

    /**
     * 从线程局部变量中获取当前线程绑定的实例。
     *
     * 该方法利用泛型语法，允许返回任何类型的对象。通过强制类型转换，将从线程局部变量中获取的对象
     * 转换为调用者期望的类型。这种方法常用于提供线程安全的单例模式或其他需要线程局部存储的场景。
     *
     * @param <T> 泛型参数，表示返回对象的类型。
     * @return 当前线程绑定的线程局部变量的实例，其类型为泛型参数 T 的类型。
     */
    public static <T> T get() {
        return (T) THREAD_LOCAL.get();
    }

    /**
     * 移除线程局部变量的当前值。
     * <p>
     * 该方法的作用是清除当前线程中线程局部变量的值。线程局部变量是一种只能被同一个线程访问和修改的变量，
     * 它提供了一种隔离不同线程之间变量访问的方式。在线程执行完特定任务或需要释放资源时，调用此方法可以确保
     * 线程局部变量不会在后续操作中意外使用，从而可能导致错误或不一致的状态。
     * </p>
     * <p>
     * 注意：由于此方法没有参数和返回值，因此注释主要解释了为什么需要进行线程局部变量的移除操作。
     * </p>
     */
    public static void remove() {
        THREAD_LOCAL.remove();
    }
}
